/*
 * 2005-11-19 lxm 创建。 
 */
package com.hd123.rumba.organization;

import java.util.List;

import com.hd123.rumba.domain.IDomain;
import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.runtime.IBaseEntity;

/**
 * 组织 | 实体 | 接口
 * <p>
 * 
 * BK = code。组织代码在state!=VALUE_STATE_DELETED范围内唯一<br>
 * 属性domain = 根域<br>
 * 
 * @author lxm
 * 
 */
public interface IOrganization extends IBaseEntity {

  /** @deprecated */
  public static String CAPTION_CLASS = COrganization.CAPTION_CLASS;
  /** @deprecated */
  public static String CAPTION_CODE = COrganization.CAPTION_CODE;
  /** @deprecated */
  public static String CAPTION_NAME = COrganization.CAPTION_NAME;
  /** @deprecated */
  public static String CAPTION_ORGANIZATIONDOMAIN = COrganization.CAPTION_ORGANIZATIONDOMAIN;
  /** @deprecated */
  public static String CAPTION_UPPERORGANIZATION = COrganization.CAPTION_UPPERORGANIZATION;
  /** @deprecated */
  public static String CAPTION_REMARK = COrganization.CAPTION_REMARK;
  /** @deprecated */
  public static String CAPTION_LEVELID = COrganization.CAPTION_LEVELID;
  /** @deprecated */
  public static String CAPTION_ORGROLES = COrganization.CAPTION_ORGROLES;

  /**
   * 代码<br>
   * 全局唯一。
   */
  public String getCode() throws BusinessException;

  public void setCode(String code) throws BusinessException;

  /** 名称 */
  public String getName() throws BusinessException;

  public void setName(String name) throws BusinessException;

  /**
   * 对应的组织域<br>
   * 只有当新增状态时可以被修改。
   */
  public IDomain getOrganizationDomain() throws BusinessException;

  void setOrganizationDomain(IDomain organizationDomain) throws BusinessException;

  /**
   * 上级组织<br>
   * 若是顶级组织，则为null。
   */
  public IOrganization getUpperOrganization() throws BusinessException;

  void setUpperOrganization(IOrganization upperOrganization) throws BusinessException;

  /** 说明 */
  public String getRemark() throws BusinessException;

  public void setRemark(String remark) throws BusinessException;

  /**
   * 层级码<br>
   * 自动生成，无需修改。用法类似于<code>Category.code</code> <code>upperOrganization</code>的冗余，格式：4444。
   */
  public String getLevelId() throws BusinessException;

  public void setLevelId(String levelId) throws BusinessException;

  /**
   * 组织角色列表<br>
   * List of IOrgRole。包含所有状态的组织角色。
   */
  public List getOrgRoles() throws BusinessException;

  public void setOrgRoles(List orgRoles) throws BusinessException;

  /**
   * 取得包含的组织角色列表。
   * 
   * @param withDeleted
   *            结果中是否包含已经删除的组织角色列表。若传入true，等价于方法getOrgRoles()。
   * @return List of IOrgRole
   * @throws BusinessException
   */
  public List getOrgRoles(boolean withDeleted) throws BusinessException;

  /**
   * 判断是否已经拥有指定的组织角色。
   * <p>
   * 
   * 不包含状态为已删除的组织角色。
   * 
   * @param orgRoleMgrIntf
   *            指定组织角色对应的管理员接口对象。
   * @return
   */
  public boolean hasRole(Class orgRoleMgrIntf) throws BusinessException;

  /**
   * 判断是否已经拥有指定的组织角色。
   * 
   * @param orgRoleMgrIntf
   *            指定组织角色对应的管理员接口对象。
   * @param withDeleted
   *            结果中是否包含已经删除的组织角色列表。
   * @return
   * @throws BusinessException
   */
  public boolean hasRole(Class orgRoleMgrIntf, boolean withDeleted) throws BusinessException;

  /**
   * 取得指定的组织角色。
   * <p>
   * 不包含状态为已删除的组织角色。
   * 
   * @param orgRoleMgrIntf
   *            指定组织角色对应的管理员接口对象。
   * @return 若不存在返回null。
   * @throws BusinessException
   */
  public IOrgRole getRole(Class orgRoleMgrIntf) throws BusinessException;

  /**
   * 取得指定的组织角色。
   * 
   * @param orgRoleMgrIntf
   *            指定组织角色对应的管理员接口对象。
   * @param withDeleted
   *            结果中是否包含已经删除的组织角色列表。
   * @return 若不存在返回null。
   * @throws BusinessException
   */
  public IOrgRole getRole(Class orgRoleMgrIntf, boolean withDeleted) throws BusinessException;

  /**
   * 取得指定的组织角色。
   * <p>
   * 
   * 不包含状态为已删除的组织角色。
   * 
   * @param roleMgr
   *            指定组织角色对应的管理员对象实例。
   * @return 若不存在返回null。
   * @throws BusinessException
   */
  public IOrgRole getRole(IOrgRoleMgr roleMgr) throws BusinessException;

  /**
   * 取得指定的组织角色。
   * 
   * @param roleMgr
   *            指定组织角色对应的管理员对象实例。
   * @param withDeleted
   *            结果中是否包含已经删除的组织角色列表。
   * @return 若不存在返回null。
   * @throws BusinessException
   */
  public IOrgRole getRole(IOrgRoleMgr roleMgr, boolean withDeleted) throws BusinessException;

  /**
   * 取得代码+名称。
   * 
   * @return
   * @throws BusinessException
   */
  public String getCodeName() throws BusinessException;

  /**
   * 取得名称+代码。
   * 
   * @return
   * @throws BusinessException
   */
  public String getNameCode() throws BusinessException;

  /**
   * 是否存在内部组织角色。
   * <p>
   * 
   * 不包含状态为已删除的组织角色。
   * 
   * @return
   * @throws BusinessException
   */
  public boolean hasInternalRole() throws BusinessException;

  /**
   * 是否存在外部组织角色。
   * <p>
   * 
   * 不包含状态为已删除的组织角色。
   * 
   * @return
   * @throws BusinessException
   */
  public boolean hasExternalRole() throws BusinessException;

  public String debugInfo() throws BusinessException;
}
